<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=11"/>
<meta name="generator" content="Doxygen 1.9.3"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>FabGL: VGA/AnsiTerminal/AnsiTerminal.ino</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
<link href="doxygen-awesome.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr id="projectrow">
  <td id="projectalign">
   <div id="projectname">FabGL
   </div>
   <div id="projectbrief">ESP32 Display Controller and Graphics Library</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.9.3 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
var searchBox = new SearchBox("searchBox", "search",'Search','.html');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(function() {
  initMenu('',true,false,'search.php','Search');
  $(document).ready(function() { init_search(); });
});
/* @license-end */
</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:d3d9a9a6595521f9666a5e94cc830dab83b65699&amp;dn=expat.txt MIT */
$(document).ready(function(){initNavTree('_v_g_a_2_ansi_terminal_2_ansi_terminal_8ino-example.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle"><div class="title">VGA/AnsiTerminal/AnsiTerminal.ino</div></div>
</div><!--header-->
<div class="contents">
<p >Serial VT/ANSI Terminal</p>
<div class="fragment"><div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment">  Created by Fabrizio Di Vittorio (fdivitto2013@gmail.com) - &lt;http://www.fabgl.com&gt;</span></div>
<div class="line"><span class="comment">  Copyright (c) 2019-2022 Fabrizio Di Vittorio.</span></div>
<div class="line"><span class="comment">  All rights reserved.</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">* Please contact fdivitto2013@gmail.com if you need a commercial license.</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">* This library and related software is available under GPL v3.</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">  FabGL is free software: you can redistribute it and/or modify</span></div>
<div class="line"><span class="comment">  it under the terms of the GNU General Public License as published by</span></div>
<div class="line"><span class="comment">  the Free Software Foundation, either version 3 of the License, or</span></div>
<div class="line"><span class="comment">  (at your option) any later version.</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">  FabGL is distributed in the hope that it will be useful,</span></div>
<div class="line"><span class="comment">  but WITHOUT ANY WARRANTY; without even the implied warranty of</span></div>
<div class="line"><span class="comment">  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span></div>
<div class="line"><span class="comment">  GNU General Public License for more details.</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">  You should have received a copy of the GNU General Public License</span></div>
<div class="line"><span class="comment">  along with FabGL.  If not, see &lt;http://www.gnu.org/licenses/&gt;.</span></div>
<div class="line"><span class="comment"> */</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="comment">/*</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">  Credits:</span></div>
<div class="line"><span class="comment">     - Guido Lehwalder, https://github.com/guidol70 : using USB-serial Port for ANSI-Terminal (https://github.com/fdivitto/FabGL/issues/110)</span></div>
<div class="line"><span class="comment"></span> </div>
<div class="line"><span class="comment">*/</span></div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include &quot;<a class="code" href="fabgl_8h.html">fabgl.h</a>&quot;</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><a id="_a0" name="_a0"></a><a class="code hl_class" href="classfabgl_1_1_bitmapped_display_controller.html">fabgl::BitmappedDisplayController</a> * DisplayController;</div>
<div class="line"><a id="_a1" name="_a1"></a><a class="code hl_class" href="classfabgl_1_1_p_s2_controller.html">fabgl::PS2Controller</a>                PS2Controller;</div>
<div class="line"><a id="_a2" name="_a2"></a><a class="code hl_class" href="classfabgl_1_1_terminal.html">fabgl::Terminal</a>                     Terminal;</div>
<div class="line"><a id="_a3" name="_a3"></a><a class="code hl_class" href="classfabgl_1_1_serial_port.html">fabgl::SerialPort</a>                   SerialPort;</div>
<div class="line"><a id="_a4" name="_a4"></a><a class="code hl_class" href="classfabgl_1_1_serial_port_terminal_connector.html">fabgl::SerialPortTerminalConnector</a>  SerialPortTerminalConnector;</div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="comment">// RTS/CTS hardware flow gpios</span></div>
<div class="line"><span class="preprocessor">#define UART_RTS 13</span></div>
<div class="line"><span class="preprocessor">#define UART_CTS 35</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="comment">// settings reset control</span></div>
<div class="line"><span class="comment">/* for old WROOM-32 boards</span></div>
<div class="line"><span class="comment">#define RESET_PIN        12</span></div>
<div class="line"><span class="comment">#define RESET_PIN_ACTIVE  1   // 0 = reset when low, 1 = reset when high</span></div>
<div class="line"><span class="comment">#define USERESETPIN       1   // 1 = reset enabled</span></div>
<div class="line"><span class="comment">//*/</span></div>
<div class="line"><span class="preprocessor">#define RESET_PIN        39</span></div>
<div class="line"><span class="preprocessor">#define RESET_PIN_ACTIVE  0   </span><span class="comment">// 0 = reset when low, 1 = reset when high</span></div>
<div class="line"><span class="preprocessor">#define USERESETPIN       0   </span><span class="comment">// 1 = reset enabled</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#define SHOWBREAKS        0</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">#include &quot;confdialog.h&quot;</span></div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">void</span> setup()</div>
<div class="line">{</div>
<div class="line"><span class="preprocessor">  #if FABGLIB_TERMINAL_DEBUG_REPORT</span></div>
<div class="line">  Serial.begin(115200); delay(500); Serial.write(<span class="stringliteral">&quot;\n\nReset\n\n&quot;</span>); <span class="comment">// DEBUG ONLY</span></div>
<div class="line"><span class="preprocessor">  #endif</span></div>
<div class="line"> </div>
<div class="line">  disableCore0WDT();</div>
<div class="line">  delay(100); <span class="comment">// experienced crashes without this delay!</span></div>
<div class="line">  disableCore1WDT();</div>
<div class="line"> </div>
<div class="line">  <span class="comment">// more stack is required for the UI (used inside Terminal.onVirtualKey)</span></div>
<div class="line">  Terminal.<a id="a5" name="a5"></a><a class="code hl_variable" href="classfabgl_1_1_terminal_a77b40b81c5e1ba039ed39891bf8c6a20.html#a77b40b81c5e1ba039ed39891bf8c6a20">keyboardReaderTaskStackSize</a> = 3000;</div>
<div class="line"> </div>
<div class="line">  Terminal.<a id="a6" name="a6"></a><a class="code hl_variable" href="classfabgl_1_1_terminal_a8508592f91c82a7a4a0c2edf4effce61.html#a8508592f91c82a7a4a0c2edf4effce61">inputQueueSize</a> = 2048; <span class="comment">// 2048 good to pass vttest</span></div>
<div class="line"> </div>
<div class="line">  preferences.begin(<span class="stringliteral">&quot;AnsiTerminal&quot;</span>, <span class="keyword">false</span>);</div>
<div class="line"> </div>
<div class="line">  ConfDialogApp::checkVersion();</div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">  #if USERESETPIN</span></div>
<div class="line">  pinMode(RESET_PIN, INPUT);</div>
<div class="line">  <span class="keywordflow">if</span> (digitalRead(RESET_PIN) == RESET_PIN_ACTIVE)</div>
<div class="line">    preferences.clear();</div>
<div class="line"><span class="preprocessor">  #endif</span></div>
<div class="line"> </div>
<div class="line">  <span class="comment">// because mouse is optional, don&#39;t re-try if it is not found (to speed-up boot)</span></div>
<div class="line">  <a id="a7" name="a7"></a><a class="code hl_function" href="classfabgl_1_1_mouse_afc85801bd90520c15ab4fe1004a45b02.html#afc85801bd90520c15ab4fe1004a45b02">fabgl::Mouse::quickCheckHardware</a>();</div>
<div class="line"> </div>
<div class="line">  <span class="comment">// keyboard configured on port 0, and optionally mouse on port 1</span></div>
<div class="line">  <span class="keywordflow">if</span> (UARTPORT_FLAGS[ConfDialogApp::getUARTPortIndex()] &amp; UARTFLAG_USE_PS2PORT1)</div>
<div class="line">    PS2Controller.<a id="a8" name="a8"></a><a class="code hl_function" href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">begin</a>(PS2Preset::KeyboardPort0);  <span class="comment">// mouse port used as serial port, so no mouse available</span></div>
<div class="line">  <span class="keywordflow">else</span></div>
<div class="line">    PS2Controller.<a class="code hl_function" href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">begin</a>(PS2Preset::KeyboardPort0_MousePort1);</div>
<div class="line"> </div>
<div class="line">  ConfDialogApp::setupDisplay();</div>
<div class="line"> </div>
<div class="line">  ConfDialogApp::loadConfiguration();</div>
<div class="line">  </div>
<div class="line"><span class="preprocessor">  #if FABGLIB_TERMINAL_DEBUG_REPORT</span></div>
<div class="line">  Terminal.<a id="a9" name="a9"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a4b5a116dd0c23f47197ff61b5d9d7f41.html#a4b5a116dd0c23f47197ff61b5d9d7f41">setLogStream</a>(Serial);  <span class="comment">// debug only</span></div>
<div class="line"><span class="preprocessor">  #endif</span></div>
<div class="line"> </div>
<div class="line">  Terminal.<a id="a10" name="a10"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a2da678d7453efcfed190b99ac93a53d0.html#a2da678d7453efcfed190b99ac93a53d0">clear</a>();</div>
<div class="line">  Terminal.<a id="a11" name="a11"></a><a class="code hl_function" href="classfabgl_1_1_terminal_aace245bfe6cab7b4339bd691077e1c23.html#aace245bfe6cab7b4339bd691077e1c23">enableCursor</a>(<span class="keyword">true</span>);</div>
<div class="line"> </div>
<div class="line">  <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_ENABLED) {</div>
<div class="line">    Terminal.<a id="a12" name="a12"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;* *  FabGL - Serial Terminal                            * *\r\n&quot;</span>);</div>
<div class="line">    Terminal.<a class="code hl_function" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;* *  2019-2022 by Fabrizio Di Vittorio - www.fabgl.com  * *\r\n\n&quot;</span>);</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Version            : %d.%d\r\n&quot;</span>, TERMVERSION_MAJ, TERMVERSION_MIN);</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Screen Size        : %d x %d\r\n&quot;</span>, DisplayController-&gt;<a id="a13" name="a13"></a><a class="code hl_function" href="classfabgl_1_1_base_display_controller_a69dd55b31e9c284aeec6f2b91a8da525.html#a69dd55b31e9c284aeec6f2b91a8da525">getViewPortWidth</a>(), DisplayController-&gt;<a id="a14" name="a14"></a><a class="code hl_function" href="classfabgl_1_1_base_display_controller_a5308b6853d3778845649f08832e96535.html#a5308b6853d3778845649f08832e96535">getViewPortHeight</a>());</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Terminal Size      : %d x %d\r\n&quot;</span>, Terminal.<a id="a15" name="a15"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a6e9094a53fd8a44ad7a061abae461e5c.html#a6e9094a53fd8a44ad7a061abae461e5c">getColumns</a>(), Terminal.<a id="a16" name="a16"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a1bb8ac2a73a5d9e6256505e1bf51c6a9.html#a1bb8ac2a73a5d9e6256505e1bf51c6a9">getRows</a>());</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Keyboard Layout    : %s\r\n&quot;</span>, PS2Controller.<a id="a17" name="a17"></a><a class="code hl_function" href="classfabgl_1_1_p_s2_controller_a9e4c9b217d63aeaf19870e5f88c88d9e.html#a9e4c9b217d63aeaf19870e5f88c88d9e">keyboard</a>()-&gt;<a id="a18" name="a18"></a><a class="code hl_function" href="classfabgl_1_1_keyboard_aef1dd1399d92a09d1ed115911b563688.html#aef1dd1399d92a09d1ed115911b563688">isKeyboardAvailable</a>() ? SupportedLayouts::names()[ConfDialogApp::getKbdLayoutIndex()] : <span class="stringliteral">&quot;No Keyboard&quot;</span>);</div>
<div class="line">    <span class="comment">//Terminal.printf(&quot;Mouse              : %s\r\n&quot;, PS2Controller.mouse()-&gt;isMouseAvailable() ? &quot;Yes&quot; : &quot;No&quot;);</span></div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Terminal Type      : %s\r\n&quot;</span>, SupportedTerminals::names()[(<span class="keywordtype">int</span>)ConfDialogApp::getTermType()]);</div>
<div class="line">    <span class="comment">//Terminal.printf(&quot;Free Memory        : %d bytes\r\n&quot;, heap_caps_get_free_size(MALLOC_CAP_32BIT));</span></div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Serial Port        : %s\r\n&quot;</span>, UARTPORT_STR[ConfDialogApp::getUARTPortIndex()]);</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;Serial Parameters  : %s\r\n&quot;</span>, ConfDialogApp::getSerParamStr());</div>
<div class="line"> </div>
<div class="line">    Terminal.<a class="code hl_function" href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">write</a>(<span class="stringliteral">&quot;\r\nPress F12 to change terminal configuration and CTRL-ALT-F12 to reset settings\r\n\n&quot;</span>);</div>
<div class="line">  } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_TEMPDISABLED) {</div>
<div class="line">    preferences.putInt(PREF_BOOTINFO, BOOTINFO_ENABLED);</div>
<div class="line">  }</div>
<div class="line"> </div>
<div class="line">  <span class="comment">// onVirtualKey is triggered whenever a key is pressed or released</span></div>
<div class="line">  Terminal.<a id="a19" name="a19"></a><a class="code hl_variable" href="classfabgl_1_1_terminal_abeb3bffa27a71e1c6dbdba8ac88d14fe.html#abeb3bffa27a71e1c6dbdba8ac88d14fe">onVirtualKeyItem</a> = [&amp;](VirtualKeyItem * vkItem) {</div>
<div class="line">    <span class="keywordflow">if</span> (vkItem-&gt;vk == <a id="a20" name="a20"></a><a class="code hl_enumvalue" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a0587819039d24d9780c51ee62538e031">VirtualKey::VK_F12</a>) {</div>
<div class="line">      <span class="comment">// CTRL ALT F12 -&gt; show reboot dialog</span></div>
<div class="line">      <span class="comment">// F12          -&gt; show configuration dialog</span></div>
<div class="line">      <span class="keywordflow">if</span> (vkItem-&gt;CTRL &amp;&amp; (vkItem-&gt;LALT || vkItem-&gt;RALT)) {</div>
<div class="line">        Terminal.<a id="a21" name="a21"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9.html#a8308b4bb6079733f4b77ced9d46da7a9">deactivate</a>();</div>
<div class="line">        preferences.clear();</div>
<div class="line">        <span class="comment">// show reboot dialog</span></div>
<div class="line">        <span class="keyword">auto</span> rebootApp = <span class="keyword">new</span> RebootDialogApp;</div>
<div class="line">        rebootApp-&gt;run(DisplayController);</div>
<div class="line">      } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!vkItem-&gt;CTRL &amp;&amp; !vkItem-&gt;LALT &amp;&amp; !vkItem-&gt;RALT &amp;&amp; !vkItem-&gt;down) {</div>
<div class="line">        <span class="comment">// releasing F12 key to open configuration dialog</span></div>
<div class="line">        Terminal.<a class="code hl_function" href="classfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9.html#a8308b4bb6079733f4b77ced9d46da7a9">deactivate</a>();</div>
<div class="line">        <span class="keywordflow">if</span> (PS2Controller.<a id="a22" name="a22"></a><a class="code hl_function" href="classfabgl_1_1_p_s2_controller_a11a1921444fc60b10cf161f433b55499.html#a11a1921444fc60b10cf161f433b55499">mouse</a>())</div>
<div class="line">          PS2Controller.<a class="code hl_function" href="classfabgl_1_1_p_s2_controller_a11a1921444fc60b10cf161f433b55499.html#a11a1921444fc60b10cf161f433b55499">mouse</a>()-&gt;<a id="a23" name="a23"></a><a class="code hl_function" href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">emptyQueue</a>();  <span class="comment">// avoid previous mouse movements to be showed on UI</span></div>
<div class="line">        <span class="keyword">auto</span> dlgApp = <span class="keyword">new</span> ConfDialogApp;</div>
<div class="line">        dlgApp-&gt;run(DisplayController);</div>
<div class="line">        <span class="keyword">auto</span> progToInstall = dlgApp-&gt;progToInstall;</div>
<div class="line">        <span class="comment">// this is required, because the terminal may not cover the entire screen</span></div>
<div class="line">        Terminal.<a id="a24" name="a24"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a80d6859a50e42ec85f538277b506ae5c.html#a80d6859a50e42ec85f538277b506ae5c">canvas</a>()-&gt;<a id="a25" name="a25"></a><a class="code hl_function" href="classfabgl_1_1_canvas_ad20897c5c8bd47f5d4005989bead0e55.html#ad20897c5c8bd47f5d4005989bead0e55">reset</a>();</div>
<div class="line">        Terminal.<a class="code hl_function" href="classfabgl_1_1_terminal_a80d6859a50e42ec85f538277b506ae5c.html#a80d6859a50e42ec85f538277b506ae5c">canvas</a>()-&gt;<a id="a26" name="a26"></a><a class="code hl_function" href="classfabgl_1_1_canvas_a833ec1b3a2cf47aa9fbf862b2136f2a2.html#a833ec1b3a2cf47aa9fbf862b2136f2a2">setBrushColor</a>(dlgApp-&gt;getBGColor());</div>
<div class="line">        Terminal.<a class="code hl_function" href="classfabgl_1_1_terminal_a80d6859a50e42ec85f538277b506ae5c.html#a80d6859a50e42ec85f538277b506ae5c">canvas</a>()-&gt;<a id="a27" name="a27"></a><a class="code hl_function" href="classfabgl_1_1_canvas_a02a657b4391aa25216ff993a0569a3c5.html#a02a657b4391aa25216ff993a0569a3c5">fillRectangle</a>(dlgApp-&gt;frameRect);        </div>
<div class="line">        <span class="keyword">delete</span> dlgApp;</div>
<div class="line">        Terminal.<a id="a28" name="a28"></a><a class="code hl_function" href="classfabgl_1_1_terminal_a844f2486fd3a16ee4e5e2f16bf0a0943.html#a844f2486fd3a16ee4e5e2f16bf0a0943">keyboard</a>()-&gt;<a id="a29" name="a29"></a><a class="code hl_function" href="classfabgl_1_1_keyboard_aefe8cfbbb777abf28e87a1caf05da5e8.html#aefe8cfbbb777abf28e87a1caf05da5e8">emptyVirtualKeyQueue</a>();</div>
<div class="line">        Terminal.<a id="a30" name="a30"></a><a class="code hl_function" href="classfabgl_1_1_terminal_aab6042247424cf6af1a4cda905b55b95.html#aab6042247424cf6af1a4cda905b55b95">activate</a>();</div>
<div class="line">        <span class="comment">// it has been requested to install a demo program?</span></div>
<div class="line">        <span class="keywordflow">if</span> (progToInstall &gt; -1)</div>
<div class="line">          installProgram(progToInstall);</div>
<div class="line">        vkItem-&gt;vk = <a id="a31" name="a31"></a><a class="code hl_enumvalue" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02acf5be65ce657a8918912d7751a8d6b06">VirtualKey::VK_NONE</a>;</div>
<div class="line">      }</div>
<div class="line">    } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (vkItem-&gt;vk == <a id="a32" name="a32"></a><a class="code hl_enumvalue" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a154da32b5a45641d6ff1af9e25dc7516">VirtualKey::VK_BREAK</a> &amp;&amp; !vkItem-&gt;down) {</div>
<div class="line">      <span class="comment">// BREAK (CTRL PAUSE) -&gt; short break (TX low for 3.5 s)</span></div>
<div class="line">      <span class="comment">// SHIFT BREAK (SHIFT CTRL PAUSE) -&gt; long break (TX low for 0.233 ms)</span></div>
<div class="line">      SerialPort.<a id="a33" name="a33"></a><a class="code hl_function" href="classfabgl_1_1_serial_port_a013585e92e02526bec54cf420abf9a06.html#a013585e92e02526bec54cf420abf9a06">sendBreak</a>(<span class="keyword">true</span>);</div>
<div class="line">      vTaskDelay((vkItem-&gt;SHIFT ? 3500 : 233) / portTICK_PERIOD_MS);</div>
<div class="line">      SerialPort.<a class="code hl_function" href="classfabgl_1_1_serial_port_a013585e92e02526bec54cf420abf9a06.html#a013585e92e02526bec54cf420abf9a06">sendBreak</a>(<span class="keyword">false</span>);</div>
<div class="line">      vkItem-&gt;vk = <a class="code hl_enumvalue" href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02acf5be65ce657a8918912d7751a8d6b06">VirtualKey::VK_NONE</a>;</div>
<div class="line">    }</div>
<div class="line">  };</div>
<div class="line"> </div>
<div class="line">  <span class="comment">// onUserSequence is triggered whenever a User Sequence has been received (ESC + &#39;_#&#39; ... &#39;$&#39;), where &#39;...&#39; is sent here</span></div>
<div class="line">  Terminal.<a id="a34" name="a34"></a><a class="code hl_variable" href="classfabgl_1_1_terminal_af05ed15439143da3bc5b6b58d2e65daa.html#af05ed15439143da3bc5b6b58d2e65daa">onUserSequence</a> = [&amp;](<span class="keywordtype">char</span> <span class="keyword">const</span> * seq) {</div>
<div class="line">    <span class="comment">// &#39;R&#39;: change resolution (for example: ESC + &quot;_#R512x384x64$&quot;)</span></div>
<div class="line">    <span class="keywordflow">for</span> (<span class="keywordtype">int</span> i = 0; i &lt; RESOLUTIONS_COUNT; ++i)</div>
<div class="line">      <span class="keywordflow">if</span> (strcmp(RESOLUTIONS_CMDSTR[i], seq) == 0) {</div>
<div class="line">        <span class="comment">// found resolution string</span></div>
<div class="line">        preferences.putInt(PREF_TEMPRESOLUTION, i);</div>
<div class="line">        <span class="keywordflow">if</span> (ConfDialogApp::getBootInfo() == BOOTINFO_ENABLED)</div>
<div class="line">          preferences.putInt(PREF_BOOTINFO, BOOTINFO_TEMPDISABLED);</div>
<div class="line">        ESP.restart();</div>
<div class="line">      }</div>
<div class="line">  };</div>
<div class="line">}</div>
<div class="line"> </div>
<div class="line"> </div>
<div class="line"><span class="keywordtype">void</span> loop()</div>
<div class="line">{</div>
<div class="line"><span class="preprocessor">  #if SHOWBREAKS</span></div>
<div class="line">  <span class="keywordflow">if</span> (SerialPort.<a id="a35" name="a35"></a><a class="code hl_function" href="classfabgl_1_1_serial_port_a774b6949333a3d03646526e004c42b1a.html#a774b6949333a3d03646526e004c42b1a">breakDetected</a>()) {</div>
<div class="line">    Terminal.printf(<span class="stringliteral">&quot;BREAK\r\n&quot;</span>);</div>
<div class="line">  }</div>
<div class="line">  vTaskDelay(50);</div>
<div class="line"><span class="preprocessor">  #else</span></div>
<div class="line"> </div>
<div class="line">  <span class="comment">// the job is done using UART interrupts</span></div>
<div class="line">  vTaskDelete(NULL);</div>
<div class="line"> </div>
<div class="line"><span class="preprocessor">  #endif</span></div>
<div class="line">}</div>
<div class="ttc" id="aclassfabgl_1_1_base_display_controller_a5308b6853d3778845649f08832e96535_html_a5308b6853d3778845649f08832e96535"><div class="ttname"><a href="classfabgl_1_1_base_display_controller_a5308b6853d3778845649f08832e96535.html#a5308b6853d3778845649f08832e96535">fabgl::BaseDisplayController::getViewPortHeight</a></div><div class="ttdeci">int getViewPortHeight()</div><div class="ttdoc">Determines vertical size of the viewport.</div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00710">displaycontroller.h:710</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_base_display_controller_a69dd55b31e9c284aeec6f2b91a8da525_html_a69dd55b31e9c284aeec6f2b91a8da525"><div class="ttname"><a href="classfabgl_1_1_base_display_controller_a69dd55b31e9c284aeec6f2b91a8da525.html#a69dd55b31e9c284aeec6f2b91a8da525">fabgl::BaseDisplayController::getViewPortWidth</a></div><div class="ttdeci">int getViewPortWidth()</div><div class="ttdoc">Determines horizontal size of the viewport.</div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00703">displaycontroller.h:703</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_bitmapped_display_controller_html"><div class="ttname"><a href="classfabgl_1_1_bitmapped_display_controller.html">fabgl::BitmappedDisplayController</a></div><div class="ttdoc">Represents the base abstract class for bitmapped display controllers.</div><div class="ttdef"><b>Definition:</b> <a href="displaycontroller_8h_source.html#l00751">displaycontroller.h:751</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_canvas_a02a657b4391aa25216ff993a0569a3c5_html_a02a657b4391aa25216ff993a0569a3c5"><div class="ttname"><a href="classfabgl_1_1_canvas_a02a657b4391aa25216ff993a0569a3c5.html#a02a657b4391aa25216ff993a0569a3c5">fabgl::Canvas::fillRectangle</a></div><div class="ttdeci">void fillRectangle(int X1, int Y1, int X2, int Y2)</div><div class="ttdoc">Fills a rectangle using the current brush color.</div><div class="ttdef"><b>Definition:</b> <a href="canvas_8cpp_source.html#l00278">canvas.cpp:278</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_canvas_a833ec1b3a2cf47aa9fbf862b2136f2a2_html_a833ec1b3a2cf47aa9fbf862b2136f2a2"><div class="ttname"><a href="classfabgl_1_1_canvas_a833ec1b3a2cf47aa9fbf862b2136f2a2.html#a833ec1b3a2cf47aa9fbf862b2136f2a2">fabgl::Canvas::setBrushColor</a></div><div class="ttdeci">void setBrushColor(uint8_t red, uint8_t green, uint8_t blue)</div><div class="ttdoc">Sets brush (background) color specifying color components.</div><div class="ttdef"><b>Definition:</b> <a href="canvas_8cpp_source.html#l00214">canvas.cpp:214</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_canvas_ad20897c5c8bd47f5d4005989bead0e55_html_ad20897c5c8bd47f5d4005989bead0e55"><div class="ttname"><a href="classfabgl_1_1_canvas_ad20897c5c8bd47f5d4005989bead0e55.html#ad20897c5c8bd47f5d4005989bead0e55">fabgl::Canvas::reset</a></div><div class="ttdeci">void reset()</div><div class="ttdoc">Resets paint state and other display controller settings.</div><div class="ttdef"><b>Definition:</b> <a href="canvas_8cpp_source.html#l00118">canvas.cpp:118</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_keyboard_aef1dd1399d92a09d1ed115911b563688_html_aef1dd1399d92a09d1ed115911b563688"><div class="ttname"><a href="classfabgl_1_1_keyboard_aef1dd1399d92a09d1ed115911b563688.html#aef1dd1399d92a09d1ed115911b563688">fabgl::Keyboard::isKeyboardAvailable</a></div><div class="ttdeci">bool isKeyboardAvailable()</div><div class="ttdoc">Checks if keyboard has been detected and correctly initialized.</div><div class="ttdef"><b>Definition:</b> <a href="keyboard_8h_source.html#l00165">keyboard.h:165</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_keyboard_aefe8cfbbb777abf28e87a1caf05da5e8_html_aefe8cfbbb777abf28e87a1caf05da5e8"><div class="ttname"><a href="classfabgl_1_1_keyboard_aefe8cfbbb777abf28e87a1caf05da5e8.html#aefe8cfbbb777abf28e87a1caf05da5e8">fabgl::Keyboard::emptyVirtualKeyQueue</a></div><div class="ttdeci">void emptyVirtualKeyQueue()</div><div class="ttdoc">Empties the virtual keys queue.</div><div class="ttdef"><b>Definition:</b> <a href="keyboard_8cpp_source.html#l00722">keyboard.cpp:722</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845_html_aefe587a398d3614e3da20cad4b8e2845"><div class="ttname"><a href="classfabgl_1_1_mouse_aefe587a398d3614e3da20cad4b8e2845.html#aefe587a398d3614e3da20cad4b8e2845">fabgl::Mouse::emptyQueue</a></div><div class="ttdeci">void emptyQueue()</div><div class="ttdoc">Empties the mouse status and events queue.</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8cpp_source.html#l00386">mouse.cpp:386</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_mouse_afc85801bd90520c15ab4fe1004a45b02_html_afc85801bd90520c15ab4fe1004a45b02"><div class="ttname"><a href="classfabgl_1_1_mouse_afc85801bd90520c15ab4fe1004a45b02.html#afc85801bd90520c15ab4fe1004a45b02">fabgl::Mouse::quickCheckHardware</a></div><div class="ttdeci">static void quickCheckHardware()</div><div class="ttdoc">Disable re-try when a mouse is not found.</div><div class="ttdef"><b>Definition:</b> <a href="mouse_8h_source.html#l00373">mouse.h:373</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_p_s2_controller_a11a1921444fc60b10cf161f433b55499_html_a11a1921444fc60b10cf161f433b55499"><div class="ttname"><a href="classfabgl_1_1_p_s2_controller_a11a1921444fc60b10cf161f433b55499.html#a11a1921444fc60b10cf161f433b55499">fabgl::PS2Controller::mouse</a></div><div class="ttdeci">static Mouse * mouse()</div><div class="ttdoc">Returns the instance of Mouse object automatically created by PS2Controller.</div><div class="ttdef"><b>Definition:</b> <a href="ps2controller_8h_source.html#l00188">ps2controller.h:188</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_p_s2_controller_a9e4c9b217d63aeaf19870e5f88c88d9e_html_a9e4c9b217d63aeaf19870e5f88c88d9e"><div class="ttname"><a href="classfabgl_1_1_p_s2_controller_a9e4c9b217d63aeaf19870e5f88c88d9e.html#a9e4c9b217d63aeaf19870e5f88c88d9e">fabgl::PS2Controller::keyboard</a></div><div class="ttdeci">static Keyboard * keyboard()</div><div class="ttdoc">Returns the instance of Keyboard object automatically created by PS2Controller.</div><div class="ttdef"><b>Definition:</b> <a href="ps2controller_8h_source.html#l00179">ps2controller.h:179</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09_html_ab8520612804a921ad834b41214a99c09"><div class="ttname"><a href="classfabgl_1_1_p_s2_controller_ab8520612804a921ad834b41214a99c09.html#ab8520612804a921ad834b41214a99c09">fabgl::PS2Controller::begin</a></div><div class="ttdeci">static void begin(gpio_num_t port0_clkGPIO, gpio_num_t port0_datGPIO, gpio_num_t port1_clkGPIO=GPIO_UNUSED, gpio_num_t port1_datGPIO=GPIO_UNUSED)</div><div class="ttdoc">Initializes PS2 device controller.</div><div class="ttdef"><b>Definition:</b> <a href="ps2controller_8cpp_source.html#l01115">ps2controller.cpp:1115</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_p_s2_controller_html"><div class="ttname"><a href="classfabgl_1_1_p_s2_controller.html">fabgl::PS2Controller</a></div><div class="ttdoc">The PS2 device controller class.</div><div class="ttdef"><b>Definition:</b> <a href="ps2controller_8h_source.html#l00082">ps2controller.h:82</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_serial_port_a013585e92e02526bec54cf420abf9a06_html_a013585e92e02526bec54cf420abf9a06"><div class="ttname"><a href="classfabgl_1_1_serial_port_a013585e92e02526bec54cf420abf9a06.html#a013585e92e02526bec54cf420abf9a06">fabgl::SerialPort::sendBreak</a></div><div class="ttdeci">void sendBreak(bool value)</div><div class="ttdoc">Activates or disattivaes Break.</div><div class="ttdef"><b>Definition:</b> <a href="serialport_8cpp_source.html#l00336">serialport.cpp:336</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_serial_port_a774b6949333a3d03646526e004c42b1a_html_a774b6949333a3d03646526e004c42b1a"><div class="ttname"><a href="classfabgl_1_1_serial_port_a774b6949333a3d03646526e004c42b1a.html#a774b6949333a3d03646526e004c42b1a">fabgl::SerialPort::breakDetected</a></div><div class="ttdeci">bool breakDetected()</div><div class="ttdoc">Gets Break detected flag status.</div><div class="ttdef"><b>Definition:</b> <a href="serialport_8h_source.html#l00271">serialport.h:271</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_serial_port_html"><div class="ttname"><a href="classfabgl_1_1_serial_port.html">fabgl::SerialPort</a></div><div class="ttdoc">SerialPort class handles UART setup and communications.</div><div class="ttdef"><b>Definition:</b> <a href="serialport_8h_source.html#l00065">serialport.h:65</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_serial_port_terminal_connector_html"><div class="ttname"><a href="classfabgl_1_1_serial_port_terminal_connector.html">fabgl::SerialPortTerminalConnector</a></div><div class="ttdoc">SerialPortTerminalConnector is an helper class used to connect Terminal and SerialPort.</div><div class="ttdef"><b>Definition:</b> <a href="serialport_8h_source.html#l00321">serialport.h:321</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a1bb8ac2a73a5d9e6256505e1bf51c6a9_html_a1bb8ac2a73a5d9e6256505e1bf51c6a9"><div class="ttname"><a href="classfabgl_1_1_terminal_a1bb8ac2a73a5d9e6256505e1bf51c6a9.html#a1bb8ac2a73a5d9e6256505e1bf51c6a9">fabgl::Terminal::getRows</a></div><div class="ttdeci">int getRows()</div><div class="ttdoc">Returns the number of lines.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01077">terminal.h:1077</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a2da678d7453efcfed190b99ac93a53d0_html_a2da678d7453efcfed190b99ac93a53d0"><div class="ttname"><a href="classfabgl_1_1_terminal_a2da678d7453efcfed190b99ac93a53d0.html#a2da678d7453efcfed190b99ac93a53d0">fabgl::Terminal::clear</a></div><div class="ttdeci">void clear(bool moveCursor=true)</div><div class="ttdoc">Clears the screen.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8cpp_source.html#l00797">terminal.cpp:797</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a4b5a116dd0c23f47197ff61b5d9d7f41_html_a4b5a116dd0c23f47197ff61b5d9d7f41"><div class="ttname"><a href="classfabgl_1_1_terminal_a4b5a116dd0c23f47197ff61b5d9d7f41.html#a4b5a116dd0c23f47197ff61b5d9d7f41">fabgl::Terminal::setLogStream</a></div><div class="ttdeci">void setLogStream(Stream &amp;stream)</div><div class="ttdoc">Sets the stream where to output debugging logs.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l00994">terminal.h:994</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a6e9094a53fd8a44ad7a061abae461e5c_html_a6e9094a53fd8a44ad7a061abae461e5c"><div class="ttname"><a href="classfabgl_1_1_terminal_a6e9094a53fd8a44ad7a061abae461e5c.html#a6e9094a53fd8a44ad7a061abae461e5c">fabgl::Terminal::getColumns</a></div><div class="ttdeci">int getColumns()</div><div class="ttdoc">Returns the number of columns.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01070">terminal.h:1070</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a77b40b81c5e1ba039ed39891bf8c6a20_html_a77b40b81c5e1ba039ed39891bf8c6a20"><div class="ttname"><a href="classfabgl_1_1_terminal_a77b40b81c5e1ba039ed39891bf8c6a20.html#a77b40b81c5e1ba039ed39891bf8c6a20">fabgl::Terminal::keyboardReaderTaskStackSize</a></div><div class="ttdeci">static int keyboardReaderTaskStackSize</div><div class="ttdoc">Stack size of the task that reads keys from keyboard and send ANSI/VT codes to output stream in Termi...</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01376">terminal.h:1376</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7_html_a7c66fc8d559f4956d4ccea196299bca7"><div class="ttname"><a href="classfabgl_1_1_terminal_a7c66fc8d559f4956d4ccea196299bca7.html#a7c66fc8d559f4956d4ccea196299bca7">fabgl::Terminal::write</a></div><div class="ttdeci">size_t write(const uint8_t *buffer, size_t size)</div><div class="ttdoc">Sends specified number of codes to the display.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8cpp_source.html#l01632">terminal.cpp:1632</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a80d6859a50e42ec85f538277b506ae5c_html_a80d6859a50e42ec85f538277b506ae5c"><div class="ttname"><a href="classfabgl_1_1_terminal_a80d6859a50e42ec85f538277b506ae5c.html#a80d6859a50e42ec85f538277b506ae5c">fabgl::Terminal::canvas</a></div><div class="ttdeci">Canvas * canvas()</div><div class="ttdoc">Gets associated canvas object.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01240">terminal.h:1240</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9_html_a8308b4bb6079733f4b77ced9d46da7a9"><div class="ttname"><a href="classfabgl_1_1_terminal_a8308b4bb6079733f4b77ced9d46da7a9.html#a8308b4bb6079733f4b77ced9d46da7a9">fabgl::Terminal::deactivate</a></div><div class="ttdeci">void deactivate()</div><div class="ttdoc">Deactivates this terminal.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8cpp_source.html#l00274">terminal.cpp:274</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a844f2486fd3a16ee4e5e2f16bf0a0943_html_a844f2486fd3a16ee4e5e2f16bf0a0943"><div class="ttname"><a href="classfabgl_1_1_terminal_a844f2486fd3a16ee4e5e2f16bf0a0943.html#a844f2486fd3a16ee4e5e2f16bf0a0943">fabgl::Terminal::keyboard</a></div><div class="ttdeci">Keyboard * keyboard()</div><div class="ttdoc">Gets associated keyboard object.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01233">terminal.h:1233</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_a8508592f91c82a7a4a0c2edf4effce61_html_a8508592f91c82a7a4a0c2edf4effce61"><div class="ttname"><a href="classfabgl_1_1_terminal_a8508592f91c82a7a4a0c2edf4effce61.html#a8508592f91c82a7a4a0c2edf4effce61">fabgl::Terminal::inputQueueSize</a></div><div class="ttdeci">static int inputQueueSize</div><div class="ttdoc">Number of characters the terminal can &quot;write&quot; without pause (increase if you have loss of characters ...</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01358">terminal.h:1358</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_aab6042247424cf6af1a4cda905b55b95_html_aab6042247424cf6af1a4cda905b55b95"><div class="ttname"><a href="classfabgl_1_1_terminal_aab6042247424cf6af1a4cda905b55b95.html#aab6042247424cf6af1a4cda905b55b95">fabgl::Terminal::activate</a></div><div class="ttdeci">void activate(TerminalTransition transition=TerminalTransition::None)</div><div class="ttdoc">Activates this terminal for input and output.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8cpp_source.html#l00199">terminal.cpp:199</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_aace245bfe6cab7b4339bd691077e1c23_html_aace245bfe6cab7b4339bd691077e1c23"><div class="ttname"><a href="classfabgl_1_1_terminal_aace245bfe6cab7b4339bd691077e1c23.html#aace245bfe6cab7b4339bd691077e1c23">fabgl::Terminal::enableCursor</a></div><div class="ttdeci">void enableCursor(bool value)</div><div class="ttdoc">Enables or disables cursor.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8cpp_source.html#l00902">terminal.cpp:902</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_abeb3bffa27a71e1c6dbdba8ac88d14fe_html_abeb3bffa27a71e1c6dbdba8ac88d14fe"><div class="ttname"><a href="classfabgl_1_1_terminal_abeb3bffa27a71e1c6dbdba8ac88d14fe.html#abeb3bffa27a71e1c6dbdba8ac88d14fe">fabgl::Terminal::onVirtualKeyItem</a></div><div class="ttdeci">Delegate&lt; VirtualKeyItem * &gt; onVirtualKeyItem</div><div class="ttdoc">Delegate called whenever a new virtual key is received from keyboard, including shift states.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01311">terminal.h:1311</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_af05ed15439143da3bc5b6b58d2e65daa_html_af05ed15439143da3bc5b6b58d2e65daa"><div class="ttname"><a href="classfabgl_1_1_terminal_af05ed15439143da3bc5b6b58d2e65daa.html#af05ed15439143da3bc5b6b58d2e65daa">fabgl::Terminal::onUserSequence</a></div><div class="ttdeci">Delegate&lt; char const * &gt; onUserSequence</div><div class="ttdoc">Delegate called whenever a new user sequence has been received.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l01321">terminal.h:1321</a></div></div>
<div class="ttc" id="aclassfabgl_1_1_terminal_html"><div class="ttname"><a href="classfabgl_1_1_terminal.html">fabgl::Terminal</a></div><div class="ttdoc">An ANSI-VT100 compatible display terminal.</div><div class="ttdef"><b>Definition:</b> <a href="terminal_8h_source.html#l00886">terminal.h:886</a></div></div>
<div class="ttc" id="afabgl_8h_html"><div class="ttname"><a href="fabgl_8h.html">fabgl.h</a></div><div class="ttdoc">This file is the all in one include file. Application can just include this file to use FabGL library...</div></div>
<div class="ttc" id="agroup___enumerations_gad0e6e31d5953384be4ea987eb3923e02_html_ggad0e6e31d5953384be4ea987eb3923e02a0587819039d24d9780c51ee62538e031"><div class="ttname"><a href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a0587819039d24d9780c51ee62538e031">fabgl::VK_F12</a></div><div class="ttdeci">@ VK_F12</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l01397">fabutils.h:1397</a></div></div>
<div class="ttc" id="agroup___enumerations_gad0e6e31d5953384be4ea987eb3923e02_html_ggad0e6e31d5953384be4ea987eb3923e02a154da32b5a45641d6ff1af9e25dc7516"><div class="ttname"><a href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02a154da32b5a45641d6ff1af9e25dc7516">fabgl::VK_BREAK</a></div><div class="ttdeci">@ VK_BREAK</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l01364">fabutils.h:1364</a></div></div>
<div class="ttc" id="agroup___enumerations_gad0e6e31d5953384be4ea987eb3923e02_html_ggad0e6e31d5953384be4ea987eb3923e02acf5be65ce657a8918912d7751a8d6b06"><div class="ttname"><a href="group___enumerations_gad0e6e31d5953384be4ea987eb3923e02.html#ggad0e6e31d5953384be4ea987eb3923e02acf5be65ce657a8918912d7751a8d6b06">fabgl::VK_NONE</a></div><div class="ttdeci">@ VK_NONE</div><div class="ttdef"><b>Definition:</b> <a href="fabutils_8h_source.html#l01218">fabutils.h:1218</a></div></div>
</div><!-- fragment --> </div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">Generated on Mon Aug 29 2022 13:52:04 for FabGL by <a href="https://www.doxygen.org/index.html"><img class="footer" src="doxygen.svg" width="104" height="31" alt="doxygen"/></a> 1.9.3 </li>
  </ul>
</div>
</body>
</html>
